﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace ModubsRTUTempactureCurve
{
    public class DelegateCommand : ICommand
    {
        public event EventHandler? CanExecuteChanged;
        private Func<bool>? CanExecuteFunc { get; set; }
        private Action DoExecute { get; set; }
        public DelegateCommand(Action doexecute, Func<bool>? canExecuteFunc = null)
        {
            DoExecute = doexecute;
        }

        public bool CanExecute(object? parameter)
        {
            if (CanExecuteFunc != null)
            {
                return CanExecuteFunc();
            }
            else { return true; }
        }

        public void Execute(object? parameter)
        {
            DoExecute.Invoke();
        }

        public void RaiseCanExecuteChanged() 
        {
            if (CanExecuteChanged != null)
            {
                CanExecuteChanged(this, EventArgs.Empty);
            } 
        }
    }

    public class DelegateCommand<T> : ICommand
    {
        // 私有字段：执行逻辑和可执行状态判断（使用 readonly 确保不可变）
        private readonly Action<T> _executeAction;
        private readonly Func<bool>? _canExecuteFunc;

        // 事件：使用 WeakEvent 模式或直接实现，但这里简化为标准事件（需确保正确触发）
        public event EventHandler? CanExecuteChanged;


        public DelegateCommand(Action<T> executeAction, Func<bool>? canExecuteFunc = null)
        {
            _executeAction = executeAction ?? throw new ArgumentNullException( nameof(executeAction), "执行委托不能为空");
            _canExecuteFunc = canExecuteFunc;
        }

        public bool CanExecute(object? parameter)
        {
            return _canExecuteFunc?.Invoke() ?? true;
        }

        // 执行逻辑：处理参数类型转换（核心优化点）
        public void Execute(object? parameter)
        {

            T? typedParameter = default;
            if (parameter != null)
            {
                // 尝试将参数转换为 T 类型（支持装箱/拆箱）
                if (parameter is T tParam)
                {
                    typedParameter = tParam;
                }
                else
                {
                    // 转换失败时抛异常（明确告知参数类型不匹配）
                    throw new ArgumentException($"参数类型 {parameter.GetType()} 无法转换为 {typeof(T)}",nameof(parameter));
                }
            }
            else if (typeof(T).IsValueType && Nullable.GetUnderlyingType(typeof(T)) == null)
            {
                // 处理非可空值类型参数为 null 的情况（如 int 接收 null 时，使用默认值）
                typedParameter = default;
            }

            // 执行核心逻辑
            _executeAction(typedParameter!);
        }

        // 触发可执行状态变更（简化写法）
        public void RaiseCanExecuteChanged()
        {
            CanExecuteChanged?.Invoke(this, EventArgs.Empty);
        }
    }

   
}
